﻿using HalconDotNet;
using MachineVision.Core.TemplateMatch;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace MachineVision.Core.Extensions
{
    public static class HObjectExtensions
    {
        //这个方法实现了使用一个区域（region）来减少图像的处理域。
        //实际上，它调用 HALCON 操作 ReduceDomain，该操作只保留图像在 region 指定区域的部分，其他部分会被忽略。
        public static HObject ReducDomain(this HObject image,HObject region)
        {
            HOperatorSet.ReduceDomain(image, region, out HObject template);
            return template;
        }

        //这个重载方法允许用户指定一个包含行和列的坐标范围的 RoiParameter 结构作为输入，来定义要保留的图像区域。
        public static HObject ReducDomain(this HObject image,RoiParameter roi)
        {
            if (image == null)
            {
                return image;
            }

            if (roi.Row1 == 0 && roi.Row2 == 0 && roi.Column1 == 0 && roi.Column2 == 0)
            {
                return image;
            }

            //如果条件满足，就生成一个矩形区域(rectangle)(该区域是经过Roi处理的区域)，然后利用该矩形调用 ReduceDomain 函数，最后返回处理后的图像。
            HOperatorSet.GenRectangle1(out HObject rectangle, roi.Row1, roi.Column1, roi.Row2, roi.Column2);
            HOperatorSet.ReduceDomain(image,rectangle,out HObject imageReduced);
            return imageReduced;
        }

        //这个方法允许将一个 HObject 图像保存到磁盘上的指定路径，文件格式为 bmp。
        public static void SaveIamge(this HObject image, string fileName)
        {
            HOperatorSet.WriteImage(image,"bmp",0,fileName);
        }

        /// <summary>
        /// 把图像转换为灰度图像
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        public static HObject Rgb1ToGray(this HObject image)
        {
            HOperatorSet.Rgb1ToGray(image, out HObject ho_GrayImage);
            return ho_GrayImage;
        }
            
        /// <summary>
        /// 抠图
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        public static HObject CropDomain(this HObject image) 
        {
            HOperatorSet.CropDomain(image, out HObject template);
            return template;
        }
    }
}
